      SUBROUTINE SURFTO3D &

!     Subroutine SURFTO3D copies surface 2D meteorology fields
!     to respective sections of 3D arrays of atmospheric model.
!     After that these arrays may be passed to SOIL_MPI subroutine

      & (uwind,vwind,q,potemp,zlevel, &
      & u,v,qv,pt,pts,phi,phis,pp, &
      & phisuf,phig,psuf, &
      & rg,rat,pl, &
      & tsnoi,t2noi,tsurw, &
      & wgnoi,w2noi,wrnoi, &
      & xlake,watdepth,tslake, &
      & alb,z0w,z0hw, &
      & veg,xlai,rsmin, &
      & emis,z0,z0h, &
      & fcveg, &
      & xice, snowini, &
      & rra,rn,h,le, &
      & gsolo,xdd2, &
      & cdm,tsurf,temmin,temmax, &
      & evapor,zonirr,uvsuf, &
      & deltaz,hsuf, &
      & Srad_surf,Lrad_surf, &
      & SraddirUV_surf,SraddirPAR_surf,SraddirIR_surf, &
      & SraddifUV_surf,SraddifPAR_surf,SraddifIR_surf, &
      & fmeth, &
      & xugeos,xvgeos,ugeos,vgeos, &
      & sigma0, &
      & xrg,xra,xpl, &
      & ts,t2,wg,w2,wr, &
      & dx,dy,xmount,ymount, &
      & timeho,dt,dtl, &
      & rhoasurf,ptop,xlatit,fcor, &
      & iclay,isand,iveg, &
      & nx,nx1,ny,ny1,ns,ns1, &
      & nstep,ndados,nf, &
      & ifsoil,iflake,ifcmodel,radpar, &
      & nlakecall, nsoilcall, &
      & verbose, &
      & li,lf, &
      & imonth,iday,ihour,iminu,iseco, &
      & fnout,fnmap,prt)

      use ALLOC, only : &
      & g, stefan, akapa, r, pi, &
      & row

      use MPI_VARIABLES, only : &
      & nxs2i, nxs2e, nys2i, nys2e, &
      & nxi, nxe, nyi, nye, &
      & nx0i, nx1e, nx2e, ny0i, ny1e, ny2e, &
      & nxsh, nysh, &
      & comm3d, ndim, size_MPI, &
      & prplcxy, parallel, &
      & request_send_2d, request_recv_2d

      use LAKE_DRIVER_PARAMETERS, only : &
      & DEFPARDRIVER, n_select_call

      implicit none

!      include 'defpardriver_interface.h'
      include 'soil.inc'

      ! Input/output variables
      real(8), intent(in) :: uwind(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(in) :: vwind(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(in) :: q(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(in) :: potemp(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(in) :: zlevel(nxs2i:nxs2e,nys2i:nys2e)

      real(8), intent(inout) :: u(nxs2i:nxs2e,nys2i:nys2e,0:ns1,1:3)
      real(8), intent(inout) :: v(nxs2i:nxs2e,nys2i:nys2e,0:ns1,1:3)
      real(8), intent(out) :: qv(nxs2i:nxs2e,nys2i:nys2e,0:ns1,1:3)
      real(8), intent(out) :: pt(nxs2i:nxs2e,nys2i:nys2e,0:ns1,1:3)
      real(8), intent(out) :: pts(nxs2i:nxs2e,nys2i:nys2e,0:ns1)
      real(8), intent(out) :: phi(nxs2i:nxs2e,nys2i:nys2e,0:ns1)
      real(8), intent(out) :: phis(nxs2i:nxs2e,nys2i:nys2e,0:ns1)
      real(8), intent(out) :: pp(nxs2i:nxs2e,nys2i:nys2e,1:4)
      real(8), intent(in) :: phisuf(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(in) :: phig(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(in) :: psuf(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: rg(nxs2i:nxs2e,nys2i:nys2e) 
      real(8), intent(inout) :: rat(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: pl(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: tsnoi(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: t2noi(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: tsurw(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: wgnoi(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: w2noi(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: wrnoi(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: xlake(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: watdepth(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: tslake(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: alb(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: z0w(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: z0hw(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: veg(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: xlai(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: rsmin(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: emis(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: z0(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: z0h(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(in) :: fcveg(1:nv2,nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(in) :: xice(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: snowini(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: rra(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: rn(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: h(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: le(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: gsolo(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: xdd2(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: cdm(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: tsurf(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: temmin(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: temmax(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: evapor(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: zonirr(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: uvsuf(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: deltaz(nxs2i:nxs2e,nys2i:nys2e) 
      real(8), intent(in) :: hsuf(nxs2i:nxs2e,nys2i:nys2e) 

      real(8), intent(inout) :: Srad_surf(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: Lrad_surf(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(in) :: SraddirUV_surf(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(in) :: SraddirPAR_surf(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(in) :: SraddirIR_surf(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(in) :: SraddifUV_surf(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(in) :: SraddifPAR_surf(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(in) :: SraddifIR_surf(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: fmeth(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: xugeos(1:ns,1:5)
      real(8), intent(inout) :: xvgeos(1:ns,1:5)
      real(8), intent(inout) :: ugeos(1:ns)
      real(8), intent(inout) :: vgeos(1:ns)
      real(8), intent(inout) :: sigma0(0:ns1)
      real(8), intent(inout) :: xrg(1:ndados) 
      real(8), intent(inout) :: xra(1:ndados)
      real(8), intent(inout) :: xpl(1:ndados)
      real(8), intent(inout) :: ts(1:2), t2(1:2)
      real(8), intent(inout) :: wg(1:2), w2(1:2)
      real(8), intent(inout) :: wr(1:2)

      real(8), intent(in) :: dx, dy
      real(8), intent(in) :: xmount, ymount 
      real(8), intent(in) :: timeho
      real(8), intent(in) :: dt, dtl
      real(8), intent(inout) :: rhoasurf(nxs2i:nxs2e,nys2i:nys2e)
      real(8), intent(inout) :: ptop
      real(8), intent(in) :: xlatit
      real(8), intent(in) :: fcor

      integer(4), intent(in) :: iclay(nxs2i:nxs2e,nys2i:nys2e)
      integer(4), intent(in) :: isand(nxs2i:nxs2e,nys2i:nys2e)
      integer(4), intent(in) :: iveg(nxs2i:nxs2e,nys2i:nys2e)

      integer(4), intent(in) :: nx, nx1, ny, ny1, ns, ns1
      integer(4), intent(in) :: nstep 
      integer(4), intent(in) :: ndados 
      integer(4), intent(inout) :: nf
      integer(4), intent(in) :: nlakecall, nsoilcall
      integer(4), intent(in) :: ifsoil, iflake, ifcmodel
      integer(4), intent(in) :: radpar
      integer(4), intent(in) :: verbose
      integer(4), intent(inout) :: li, lf
      integer(4), intent(in) :: imonth, iday, ihour, iminu, iseco

      character(len=80), intent(in) :: fnout, fnmap

      logical, intent(in) :: prt

!     Local variables
      integer(4) :: ix, iy

      ptop = 2.d+5
      do iy = ny0i, ny1e
        do ix = nx0i, nx1e
          u(ix,iy,ns-1,2) = uwind(ix,iy)
          v(ix,iy,ns-1,2) = vwind(ix,iy)
          qv(ix,iy,ns-1,2) = q(ix,iy)
          pt(ix,iy,ns-1,2) = 0.d0
          pts(ix,iy,ns-1) = potemp(ix,iy)
          phi(ix,iy,ns-1) = 0.d0
          phis(ix,iy,ns-1) = zlevel(ix,iy)*g
          pp(ix,iy,2) = psuf(ix,iy) - ptop
        enddo
      enddo

      sigma0(ns-1) = 1. ! It means surface presssure will be used 
                        ! to transfer from potential temperature
                        ! to "ordinary" temperature at screen level

      END SUBROUTINE SURFTO3D
